<?php
namespace core
;
class Request
{
    /**
     * @var object 对象实例
     */
    protected static $instance;

    protected $module_name;

    protected $controller_name;

    protected $action_name;

    /**
     * 全局过滤规则
     * @var mixed|null
     */
    protected $filter;

    /**
     * php://input
     * @var false|string
     */
    protected $input;

    public $request_url;

    /**
     * 构造函数
     * Request constructor.
     * @param array $options
     */
    protected function __construct($options = [])
    {
        $this->request_url  = $_SERVER['REQUEST_URI'];
        foreach ($options as $name => $item) {
            if (property_exists($this, $name)) {
                $this->$name = $item;
            }
        }
        if (is_null($this->filter)) {
            $this->filter = Config::get('app.default_filter');
        }

        // 保存 php://input
        $this->input = file_get_contents('php://input');
    }

    /**
     * 初始化
     * @param array $options
     * @return object|static
     */
    public static function instance($options = [])
    {
        if (is_null(self::$instance)) {
            self::$instance = new static($options);
        }
        return self::$instance;
    }

    /**
     * 销毁当前请求对象
     */
    public static function destroy()
    {
        if (!is_null(self::$instance)) {
            self::$instance = null;
        }
    }

    /**
     * 设置模块名称
     * @param $name
     */
    public function setModuleName($name)
    {
        $this->module_name = $name;
    }

    /**
     * 设置控制器
     * @param $name
     */
    public function setControllerName($name)
    {
        $this->controller_name = $name;
    }

    /**
     * 设置动作名称
     * @param $name
     */
    public function setActionName($name)
    {
        $this->action_name = $name;
    }

    /**
     * 获取模块
     * @return mixed
     */
    public function getModuleName()
    {
        return $this->module_name;
    }

    /**
     * 获取控制器
     * @return mixed
     */
    public function getControllerName()
    {
        return $this->controller_name;
    }

    /**
     * 获取方法明
     * @return mixed
     */
    public function getActionName()
    {
        return $this->action_name;
    }

    /**
     * 获取请求参数 $_REQUEST
     * @param string $name 参数键
     * @param string $default 不存在默认值
     * @return array|mixed|string 返回
     */
    function param($name='',$default=''){
        if($name){
            return isset($_REQUEST[$name])?$_REQUEST[$name]:$default;
        }else{
            unset($_REQUEST[$this->request_url]);//写在地址栏后面得url
            return $_REQUEST;
        }
    }

    /**
     * 获取请求参数 $_GET
     * @param string $name 参数键
     * @param string $default 不存在默认值
     * @return array|mixed|string 返回
     */
    function get($name='',$default=''){
        if($name){
            return isset($_GET[$name])?$_GET[$name]:$default;
        }else{
            unset($_GET[$this->request_url]);//卸载地址栏后面得url
            return $_GET;
        }
    }

    /**
     * 获取请求参数 $_POST
     * @param string $name 参数键
     * @param string $default 不存在默认值
     * @return array|mixed|string 返回
     */
    function post($name='',$default=''){
        if($name){
            return isset($_POST[$name])?$_POST[$name]:$default;
        }else{
            return $_POST;
        }
    }

    /**
     * 是否POST请求
     * @return bool
     */
    function isPost(){
        return isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD'])=='POST';
    }

    /**
     * 是否GET请求
     * @return bool
     */
    function isGet(){
        return isset($_SERVER['REQUEST_METHOD']) && strtoupper($_SERVER['REQUEST_METHOD'])=='GET';
    }

    /**
     * 是否AJAX请求
     * @return bool
     */
    function isAjax(){
        return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtoupper($_SERVER['HTTP_X_REQUESTED_WITH'])=='XMLHTTPREQUEST';
    }

}
